/**
 * 阿里云OSS sdk
 */
import OSS from 'ali-oss';
import { aliyun_oss_account } from '@/config';

const {
  accessKey,
  accessSecret
} = aliyun_oss_account;

// TODO 可是前端请求时 可以看到key和secret 如果真的要在客户端使用 官方建议使用STS临时安全令牌
const client = new OSS({
  accessKeyId: accessKey,
  accessKeySecret: accessSecret,
  region: 'oss-cn-shenzhen',
  bucket: 'breaktech'
});
/**
 * 上传文件
 * 若file为字符串 则先包装为文件
 * @param dir 目录
 * @param file 上传的文件内容
 * @param filename 文件名
 * @returns {Promise<unknown>}
 */
export const putObject = function(dir, file, filename) {
  return new Promise((resolve, reject) => {
    try {
      // TODO 上传个文件这么绕吗
      if (typeof file === 'string') {
        dir = dir + '/' + filename;
        file = new OSS.Buffer(file);
      } else {
        dir = dir + '/' + file.name;
      }
      const result = client.put(dir, file);
      resolve(result);
    } catch (e) {
      reject(e);
    }
  });
};

// 获取文件链接
export const getObjectUrl = function(filePath, filename) {
  return new Promise((resolve, reject) => {
    try {
      let url = '';
      if (filename) {
        const response = {
          'content-disposition': `attachment; filename=${encodeURIComponent(filename)}`
        };
        url = client.signatureUrl(filePath, { response });
      } else {
        url = client.signatureUrl(filePath);
      }
      resolve(url);
    } catch (e) {
      console.error(e);
      reject(e);
    }
  });
};

// 删除单个文件
export const deleteObject = function(filePath) {
  try {
    // TODO 官方的介绍 delete方法好像并不需要versionId
    client.delete(filePath);
  } catch (e) {
    console.error(e);
  }
};

// 批量删除文件
// TODO 这里应该有bug 若删除文件夹 文件夹下的文件并没有删除
export const deleteObjectMulti = function(filePaths) {
  // TODO 不判断会影响什么吗?
  if (filePaths.length === 0) {
    return;
  }
  try {
    client.deleteMulti(filePaths);
  } catch (e) {
    console.error(e);
  }
};

export const isExistObject = async function(name, options = {}) {
  try {
    await client.head(name, options);
  } catch (error) {
    if (error.code === 'NoSuchKey') {
      console.log('文件不存在');
    }
  }
};

// 获取某一目录下的所有文件
export const getFileList = function(filePath) {
  return new Promise((resolve, reject) => {
    try {
      client.list({
        prefix: filePath,
        delimiter: '/'
      }).then((result) => {
        resolve(result);
      });
    } catch (e) {
      console.error(e);
      reject(e);
    }
  });
};
